package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;
import java.time.LocalDateTime;

/**
 * 系统租户实体类
 * 
 * 功能特性：
 * - 支持多租户数据隔离管理
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持租户状态管理
 * - 支持租户过期时间管理
 * - 支持租户联系信息管理
 * 
 * 业务说明：
 * - 租户管理是SaaS应用的核心组件
 * - 支持租户的基本信息管理
 * - 支持租户的状态控制（正常/停用）
 * - 支持租户的过期时间管理
 * - 支持租户的联系信息管理
 * - 支持租户的域名管理
 * 
 * 关联关系：
 * - 与用户表：一对多关系，通过tenant_id关联
 * - 与部门表：一对多关系，通过tenant_id关联
 * - 与角色表：一对多关系，通过tenant_id关联
 * - 与菜单表：一对多关系，通过tenant_id关联
 * - 与配置表：一对多关系，通过tenant_id关联
 * - 与字典表：一对多关系，通过tenant_id关联
 * 
 * 数据约束：
 * - tenant_name：租户名称，必填，全局唯一
 * - status：租户状态，0=正常，1=停用
 * - expire_time：过期时间，可以为空（永不过期）
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_tenant")
public class SysTenant extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 租户ID
     * 主键，自增长
     */
    @TableId("tenant_id")
    private Long tenantId;

    /**
     * 租户名称
     * 租户显示名称，必填字段，全局唯一
     */
    @TableField("tenant_name")
    private String tenantName;

    /**
     * 联系人
     * 租户联系人姓名
     */
    @TableField("contact_user_name")
    private String contactUserName;

    /**
     * 联系电话
     * 租户联系电话
     */
    @TableField("contact_phone")
    private String contactPhone;

    /**
     * 联系邮箱
     * 租户联系邮箱
     */
    @TableField("contact_email")
    private String contactEmail;

    /**
     * 租户状态
     * 0=正常，1=停用
     * 停用的租户及其所有数据都不能被访问
     */
    @TableField("status")
    private String status;

    /**
     * 域名
     * 租户专属域名，用于多租户访问控制
     */
    @TableField("domain")
    private String domain;

    /**
     * 过期时间
     * 租户过期时间，为空表示永不过期
     */
    @TableField("expire_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime expireTime;
}
